package org.zjh.controller.listener;

import org.zjh.controller.GameController;
import org.zjh.utils.PokerUtil;
import org.zjh.view.game.GamePanel;
import org.zjh.view.ui.GameUi;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


/**
 * @description: 游戏窗口菜单监听
 * @author 郑佳豪
 * @date 2024/10/13 5:11
 * @version 1.0
 */
public class MenuListener implements ActionListener {


    private final GameController gameController = GameController.getInstance();
    private int pausedPokerIndex = -1;  // 记录暂停时的发牌进度



    @Override
    public void actionPerformed(ActionEvent e) {
        String name = e.getActionCommand();
        switch (name) {
            case "start":
                start();
                break;
            case "pause":
                pause();
                break;
            case "continueGame":
                continueGame();
                break;
            case "restart":
                restart();
                break;
            case "quit":
                quit();
                break;
            case "aboutAuthor":
                showAboutAuthor();
                break;
            case "aboutGame":
                aboutGame();
                break;

        }
    }


    /**
     * 游戏开始方法
     */
    private void start() {
        GameUi.gameFrame.getPause().setEnabled(true);
        GameUi.gameFrame.getRestart().setEnabled(true);
        GameUi.gameFrame.getStart().setEnabled(false);

        //设置扑克牌堆
        gameController.setPokerBoxList(PokerUtil.generatePokerBoxList());
        //设置地主牌集合
        gameController.setLandOwnerPokerList(PokerUtil.getDZPoker());
        //面板画出牌堆
        PokerUtil.painPoker();
        //发牌开始
        gameController.getDealCardsTimer().getTimer().start();

    }


    /**
     * 游戏暂停
     */
    private void pause() {
        // 暂停发牌定时器
        if (gameController.getDealCardsTimer().getTimer().isRunning()) {
            gameController.getDealCardsTimer().getTimer().stop();
            pausedPokerIndex = gameController.getCurrentPokerIndex();  // 保存当前发牌进度
        }

        // 暂停叫分定时器
        if (gameController.getCallPointTimer().getCountdownTimer() != null &&
                gameController.getCallPointTimer().getCountdownTimer().isRunning()) {
            gameController.getCallPointTimer().getCountdownTimer().stop();
        }

        // 暂停出牌定时器
        if (gameController.getDiscardPokersTimer().getCountTimer() != null &&
                gameController.getDiscardPokersTimer().getCountTimer().isRunning()) {
            gameController.getDiscardPokersTimer().getCountTimer().stop();
        }

        //设置游戏暂停不可点击
        GameUi.gameFrame.getContinueGame().setEnabled(true);
        JOptionPane.showMessageDialog(null, "游戏已暂停", "暂停", JOptionPane.INFORMATION_MESSAGE);
    }



    /**
     * 继续游戏方法
     */
    private void continueGame() {
        // 恢复发牌定时器（如果尚未发完牌）
        if (gameController.getCurrentPokerIndex() < 51) {
            gameController.setCurrentPokerIndex(pausedPokerIndex);  // 恢复到暂停时的发牌进度
            gameController.getDealCardsTimer().getTimer().start();  // 继续发牌定时器
        }else{ //发完牌 只恢复 叫分定时器 和 出牌定时器

            //判断是否 进入到出牌阶段 如果是 恢复出牌定时器
            if (gameController.getCurDiscardPokerPlayer() != null){
                if (gameController.getDiscardPokersTimer().getCountTimer() != null) {
                    gameController.getDiscardPokersTimer().getCountTimer().start();  // 继续出牌倒计时
                }
            }else{ // 没进入 出牌阶段 那就是 叫分阶段
                // 恢复叫分定时器
                if (gameController.getCallPointTimer().getCountdownTimer() != null ) {
                    gameController.getCallPointTimer().getCountdownTimer().start();  // 继续叫分倒计时
                }
            }

        }
        //设置游戏暂停可点击
        GameUi.gameFrame.getContinueGame().setEnabled(false);
    }




    /**
     * 游戏重新开始
     */
    private void restart() {
        GamePanel gamePanel = GameUi.gameFrame.getGamePanel();
        //倍数不可见
        gamePanel.getMultipleJLabel().setVisible(false);
        //倍数初始化
        gamePanel.getMultipleJLabel().setText("倍数：0");
        //明牌设置不可见
        gamePanel.getFaceUpJlabel().setVisible(false);
        //出牌设置不可见
        gamePanel.setDiscardPokerVisibleFalse();
        //玩家 不要标签重置
        gamePanel.resetNoDiscardPokerLabel();
        //重置托管状态
        gameController.getPlayer().setHosted(false);
        gamePanel.getMultipleJLabel().setVisible(false);
        //叫分定时器停止
        if (gameController.getCallPointTimer().getCountdownTimer() != null) {
            gameController.getCallPointTimer().getCountdownTimer().stop();
        }
        //发牌定时器停止
        if (gameController.getDiscardPokersTimer().getCountTimer() != null) {
            gameController.getDiscardPokersTimer().getCountTimer().stop();
        }

        //玩家的叫分结果重置
        gameController.getComputerA().setCallPointResult(0);
        gameController.getComputerB().setCallPointResult(0);
        gameController.getPlayer().setCallPointResult(0);
        //将游戏面板中的叫分结果标签重置
        gamePanel.resetCallPointResultJLabelAndCountDownJLabel();
        //游戏头像设置不可见
        gamePanel.setAvatarVisibleFalse();
        //将实际玩家叫分标签隐藏
        GameUi.gameFrame.getGamePanel().setCallPointJLabelVisibleFalse();
        //返回值为空 代表都不叫 那么重新发牌
        PokerUtil.reDealPoker();
    }


    /**
     * 退出
     */
    private void quit() {
        GameUi.gameFrame.dispose();
        //如果菜单界面存在那么显示菜单界面
        if (GameUi.gameMenuFrame != null) {
            GameUi.gameMenuFrame.setVisible(true);
        }
    }



    /**
     * 展示作者
     */
    private void showAboutAuthor() {
        String aboutAuthorMessage = "关于作者\n" +
                "姓名: 郑佳豪\n" +
                "邮箱: [zjh20021110@outlook.com]\n" +
                "项目描述: 本项目是一个简单的游戏，旨在提供娱乐和编程练习。\n" +
                "感谢所有支持者和贡献者！";
        JOptionPane.showMessageDialog(null, aboutAuthorMessage, "关于作者", JOptionPane.INFORMATION_MESSAGE);
    }


    /**
     * 关于游戏
     */
    private void aboutGame() {
        String aboutGameMessage = "关于游戏\n" +
                "游戏名称: [斗地主]\n" +
                "版本: 1.0";
        JOptionPane.showMessageDialog(null, aboutGameMessage, "关于游戏", JOptionPane.INFORMATION_MESSAGE);
    }

}
